home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 18 / AMIGAplus Sonderheft 18 (1999)(ICP)(DE)[!].iso / Forum / MichaelRoth / 3-3-99 / Swapbuffer / swapbuffer.asm < prev   
Assembly Source File  |  1998-08-15  |  4KB  |  145 lines

  1.  
  2. ;// Include
  3.           Include  assem:macro/Dir
  4.           Include  assem:macro/Exec.m
  5.           Include  assem:macro/Dos.m
  6.           Include  Dos/DosExtens.i
  7.           include  macro/filelength
  8. ;\\
  9.  
  10. ;// Libraries öffnen
  11.           OpenDos  37
  12. ;\\
  13.  
  14. ;//ReadArgs
  15.           move.l   #inputstr,d1                  ; Eingabe String
  16.           move.l   #arry,d2                      ; Arry
  17.           move.l   #0,d3                         ; Keine Externe Structur
  18.           Dos      ReadArgs                      ; Argumente Lesen
  19.           move.l   d0,rdargs                     ; speichern
  20.           bne.s    .1                            ; prüfen ob alles o.k.
  21.           error    cleanup,20                    ; o.k. >.1 Ansonsten Fehlermeldung beenden
  22. .1                                               ;
  23.           lea   arry,a0                          ; Arry nach a0
  24. ;\\
  25.  
  26. ;//File Öffnen und gröe bestimmen
  27.           move.l   (a0),d1
  28.           move.l   #MODE_OLDFILE,d2              ; 1005
  29.           Dos      Open                          ; File Öffnen
  30.           bne.s    .2
  31.           error    cleanup,20
  32. .2
  33.           move.l   d0,fh
  34.           filelength fh,filelänge                ; Filelänge bestimmen
  35. ;\\
  36.  
  37. ;// Speicher Reservieren
  38.          move.l    filelänge,d0
  39.          move.l    #MEMF_CLEAR,d1
  40.          Exec      AllocMem
  41.          move.l    d0,memblock
  42.          bne.s     .memallockok
  43.          error     cleanup,20
  44. .memallockok
  45. ;\\
  46.  
  47. ;// File einlesen
  48.          move.l   fh,d1
  49.          move.l   memblock,d2
  50.          move.l   filelänge,d3
  51.          Dos      Read
  52.          cmp.l    filelänge,d0
  53.          beq.s    .readok
  54.          error    cleanup,20
  55. .readok
  56. ;\\
  57.  
  58.          move.l    memblock,a0
  59.          move.l    filelänge,d0
  60.  
  61. swapbuff
  62. ; Dreht einen Buffer um; das lezte wird das 1 Byte etc.
  63. ; A0 -> Buffer
  64. ; D0 -> Länge
  65.  
  66. ; SubRegister
  67. ; A1 x  Endadresse
  68. ; D1 x  Zwischenspeicher
  69.  
  70.          lea       (a0,d0),a1                    ; Endadresse berechnen
  71.                                                  ; Weil die länge = 12
  72.                                                  ; ist, wir aber von 0 ab
  73.                                                  ; beginnen zu Rechnen
  74.                                                  ; ist das 1(a,d) entffalen.
  75.                                                  ; Die länge ist zwar 12 Bytes
  76.                                                  ; aber der Buffer wird von 0 ab gezählt
  77.          lsr.l     #1,d0                         ; / 2
  78. .loop
  79.          move.b    -(a1),d1                      ; Leztes Zeichen auslesen
  80.          move.b    (a0),(a1)                     ; 1. in Lezte Position Kopieren
  81.          move.b    d1,(a0)+                      ; leztes in 1 Position
  82.          sub.l     #1,d0
  83.          bne       .loop                         ; dbra entfernt wegen
  84.                                                  ; Filegrößen über $FFFF
  85.  
  86.  
  87. ;// Zielfile Öffnen
  88.          lea       arry,a0                          ; Arry nach a0
  89.          move.l    4(a0),d1
  90.          move.l    #MODE_NEWFILE,d2
  91.          Dos       Open
  92.          move.l    d0,d7
  93.          bne       .ok
  94.          error     cleanup,20
  95. .ok
  96.  
  97.          move.l    d7,d1
  98.          move.l    memblock,d2
  99.          move.l    filelänge,d3
  100.          Dos       Write
  101.  
  102.          move.l    d7,d1
  103.          Dos       Close
  104. ;\\
  105.  
  106. ;// CleanUp
  107. cleanup
  108.           move.l   rdargs,d1
  109.           beq.s    .end                          ; Argumente da ?
  110.           Dos      FreeArgs                      ; Wenn Nein beenden
  111.  
  112.           move.l   fh,d1
  113.           beq.s    .1                            ; File geöffnet
  114.           Dos      Close                         ; Wenn nein weiter
  115. .1
  116.           move.l    memblock,d0
  117.           beq.s     .2
  118.           move.l    d0,a1
  119.           move.l    filelänge,d0
  120.           Exec      FreeMem
  121. .2
  122. .end
  123.           closedos
  124.           moveq    #0,d0
  125.           rts
  126. ;\\
  127.  
  128. ;// Data
  129.  DATA
  130. inputstr
  131.          dc.b      "Source/A,Dest/A",0
  132.  BSS
  133.  cnop 0,4
  134. arry     ds.l      2
  135. rdargs   ds.l      1
  136. fh       ds.l      1
  137. filelänge
  138.          ds.l      1
  139. memblock ds.l      1
  140. insert   dc.b      4,0
  141. ;\\
  142.  
  143.  code
  144.  
  145.